﻿#ifndef __SPDF_EXT_H__
#define __SPDF_EXT_H__

#include "spdf_opt.h"
#include "rtctime.h"
#include "mytype.h"

/*****************************************************************************
* @brief   表格
****************************************************************************** 
* 文件显示操作需在 spdf_page_begin_text 和 spdf_page_end_text之间
* 且不允许其他文本显示相关操作
*****************************************************************************/
#define SPDF_FORM_ALAIN_LEFT		0
#define SPDF_FORM_ALAIN_MID			1

typedef struct
{
	ii16 x0, y0;
	SPDF_Page page;
	
	struct
	{
		ii16 num;
	    ii16 *size_list;
	    ii16 fixd_size;
	} col;

	struct
	{
	    ii16 num;
	    ii16 size;
	} row;

	struct
	{
		ii16 y_offset, x_offset, font_size;
		ii16 x,y;
		ii16 col, row;
		uu8 alain;
		uu8 hex_force;			//Y 强制使用Hex模式输出文本 //必须在begin前配置
	} txt;

	struct
	{
	    ii16 ext_wide;			//Y 外框线宽
	    ii16 inn_wide;			//Y 内框线宽
		uu8 ext_r,ext_g, ext_b;
		uu8 inn_r, inn_g, inn_b;
		uu8 ext_dash_len1;		//Y 含一位小数点
		uu8 ext_dash_len0;		//Y 任意一个为0视为实线
		uu8 inn_dash_len1;
		uu8 inn_dash_len0;
	} frame;
} spdf_form_type;

/*****************************************************************************/

// 挂载页面
void spdf_form_page_mount(spdf_form_type * form, SPDF_Page page);

// 设置表格行属性
void spdf_form_row_set(spdf_form_type * form, ii16 num, ii16 size);

// 设置表格列属性
void spdf_form_col_set(spdf_form_type * form, ii16 num, ii16 * size, ii16 fixed_size);

// 计算表格原点 - 输入为第四象限坐标 绝对值 // 应事先配置好row 和 col
void spdf_form_org(spdf_form_type * form, ii16 x, ii16 y);

// 设置表格线宽属性
void spdf_form_frame_ext_set(spdf_form_type * form, ii16 wide, uu8 r, uu8 g, uu8 b);
void spdf_form_frame_inn_set(spdf_form_type * form, ii16 wide, uu8 r, uu8 g, uu8 b);

/******************************************************************************/

// 绘制表格
void spdf_form_draw(spdf_form_type * form);

// 向表格添加线 - 划线空间内可用
void spdf_form_line_sp(spdf_form_type * form, 
	ii16 row, ii16 col, 
	ii16 x0, ii16 y0,
	ii16 x1, ii16 y1);

// 开始表格文本
void spdf_form_text_start(spdf_form_type * form);

// 结束表格文本
void spdf_form_text_end(spdf_form_type * form);

// 设置文本在表格内偏移
void spdf_form_text_offset(spdf_form_type * form,ii16 x, ii16 y);

// 设置字体大小，需和实际字体大小一致
void spdf_form_text_font(spdf_form_type * form,const char *font_name, ii16 size);

// 设置文本对齐方式
void spdf_form_text_alain(spdf_form_type * form, uu8 alain);

/******************************************************************************/

// 向表格添加文本, 修改表格指针
void spdf_form_text(spdf_form_type * form, ii16 row, ii16 col, const char * text);

// 向表格添加文本, 含偏移信息，强制左对齐, 忽略原偏移
void spdf_form_text_sp(spdf_form_type * form, 
	ii16 row, ii16 col, 
	ii16 x_offset, ii16 y_offset,
	const char * text);

// 表格指针指向下一行，最后一行则指向下一列首行
void spdf_form_text_next_row(spdf_form_type * form);

// 表格指针指向下一列，最后一列则指向下一行首列
void spdf_form_text_next_col(spdf_form_type * form);

// 在表格指针位置显示文本
void spdf_form_text_auto(spdf_form_type * form, const char * text);




/*******************************************************************************
* @brief   曲线, 除字号外的所有 坐标、长度、点位置均含一位效数
*******************************************************************************/
// 线定义
typedef struct
{
    uu8 wide;							// 线宽
    uu8 r,g,b;							// 颜色
} spdf_chart_base_line_type;

// 网格独立横线
typedef struct
{
    spdf_chart_base_line_type attr;		// 基本属性
	ii16 site;							// 位置信息，量化由外部决定
	ii8 mode;							// 线形 0-实线 1-虚线
	ii8 len1;							// 虚线线段长
	ii8 len0;							// 虚线空白长
} spdf_chart_fun_line_type;

typedef struct
{
	ii16 x_pos;
	ii16 val;
} spdf_chart_point_type;

// 数据曲线属性
typedef struct
{
    spdf_chart_base_line_type attr;		// 线属性
	uu16 point_pos_offset;				// 值模式起点偏移点数，数据列表首点的x坐标 = point_pos_offset * axis_x_inc,点模式无效
    uu16 point_amount;					// 点数量
    const void *point_val_list;			// 点Y坐标列表
	ii16 point_val_offset;				// 点值偏移-数值列表模式有效
    ii16 point_val_coef;				// 点系数 Q.12    //点的坐标位置 = (point + offset) * coef >> 12 + axis_y
	ii16 axis_y_offset;					// 点y坐标偏移
	ii16 axis_x_inc;					// 点X坐标增量-代表每点x向长度
	uu8	 point_mode;					// 点模式 0-ii16数值列表 1-坐标列表
	/*垂线 - 曲线至X轴 - 颜色继承主线颜色*/
	uu8 v_l_mode;						// 垂线模式 b0->x  b1->y  b2->端点空格 
    uu8 v_l_amount;						// 垂线数量	
    const spdf_chart_fun_line_type *v_l;// 多功能线中的site，当前数据列表的索引
} spdf_chart_line_type;

// Y轴文本属性
typedef struct
{
	uu8 r,g,b;								// 颜色
	uu8 ipn;								// 值规格属性
	uu8 val_attr;							// i to string attr
	char * unit;							// 单位，数值尾缀
	ii32 val_start;							// 原点值
	ii32 val_inc;							// 增量
} spdf_chart_ytxt_type;

// 曲线表结构
typedef struct
{
	ii16 x0, y0;							// 原点
	ii16 width, height;						// 尺寸
	SPDF_Page page;							// 挂载页面
	
	struct
	{
	    // 线宽及颜色属性，含两位小数点
	    spdf_chart_base_line_type l_axis;	// 轴线属性
	    spdf_chart_base_line_type l_grid_m;	// 主线格属性
	    spdf_chart_base_line_type l_grid_s;	// 子线格属性
	    ii16 grid_x_m_wide;					// x向主格宽度,设为0没有
	    ii16 grid_y_m_wide;					// y向主格宽度,设为0没有
	    ii8  grid_x_s_num;					// x向子格数量,设为0没有
	    ii8  grid_y_s_num;					// y向子格数量,设为0没有
		ii8  arrows_offset;					// 箭头延申 为0无箭头, 无箭头时非零补充右上边框
	    ii8  arrows_size;					// 箭头大小 为0无箭头
		uu8  mode;							// 0-仅轴，1-网格，2刻度
		ii8  scale_s_size;					// 刻度模式时-子刻度长度
		ii8  scale_m_size;					// 刻度模式时-主刻度长度
		// 独立横线
		uu8 hl_amount;						// 横线数量
		const spdf_chart_fun_line_type *hl;	// 横线属性
	} frame;

	struct
	{
		// 坐标轴文本开关
		uu8 enable;							// 显示开关
		
		// 文本和轴线间距
		ii16 site_offset_y;		
		ii16 site_offset_x;		
		
		// X轴文本
	    uu8 x_mode;							//0-数值 //1-rtc-tm // 2-rtc/td //3-rtc/dt
		uu8 x_r,x_g,x_b;					// 颜色
		uu8 x_val_ipn;						// 数值模式的值规格属性
		ii16 x_val_inc;						// 数值增量
		ii32 x_val_start;					// 数值原点值
		sig_time_type x_rtc;				// rtc模式原点值
		
		// Y轴文本
		const spdf_chart_ytxt_type * ytxt;	// Y轴数值列表
		uu8  y_txt_num;						// y轴数值数量
		
		ii8 font_size;						// 字号
		const char *font_name;				// 字体
		// 文本当前位置 
		ii16 x,y;
	} txt;

	struct
	{
		uu8 axis_draw;						//指示正在画轴
	} st;
	
	uu8 dir;								//显示方向
	uu8 line_num;							//曲线数量-为0时不绘制
	const spdf_chart_line_type * line_list; //曲线列表

} spdf_chart_type;

// 页面挂载
void spdf_chart_mount(spdf_chart_type * chart, SPDF_Page page);

// 绘制曲线
void spdf_chart_show(spdf_chart_type * chart);

// 默认设置
void spdf_chart_default(spdf_chart_type * chart);

// 轴属性设置
void spdf_chart_axis(spdf_chart_type * chart, uu8 wide, uu8 r, uu8 g, uu8 b);
void spdf_chart_grid_m(spdf_chart_type * chart, uu8 wide, uu8 r, uu8 g, uu8 b);
void spdf_chart_grid_s(spdf_chart_type * chart, uu8 wide, uu8 r, uu8 g, uu8 b);

///////////////////////////////////////////////////////////////////////////////////
// 辅助功能
// 显示坐标文本 // 如果文本开启，该API会被spdf_chart_show调用
void spdf_chart_txt_show(spdf_chart_type * chart);

// 添加曲线到chart，该接口被spdf_chart_show调用，也可独立使用
void spdf_chart_line_add(spdf_chart_type * chart, const spdf_chart_line_type * line);

// 

#endif //__SPDF_EXT_H__
